-----Исходное сообщение----- От: Radovets Konstantin Кому: 'Артем' Дата: 14 марта 2000 г. 8:55 Тема: Ответ: subscript Привет! Вообще-то проблема сводится к тому, что почему-то нельзя одновременно определить обработку функции void CMyMenuView::OnHelpTest() в классе CMyMenuView и void CMainFrame OnHelpTest::OnHelpTest() в классе CMainFrame где фунция OnHelpTest() -ф-ция обработки элемента меню ID_HELP_TEST (где ставится галочка)Кстати задача оказалась интересной. Действительно, если определять обработку команд меню в разных классах, то будет работать только один. То есть определите функцию обработки меню в классе вида View в классе рамки Frame, то будет только работать только одна. Я предлогаю свой вариант обхода данной проблеммы. Не знаю правильный он или нет и может есть другие пути. Кто знает пишите.
Идея вот какая. Мы можем определить обработку события в классе скажем вида (View) и от туда вызовем функции остальных классов. Вот примерно так.

Итак, создаем прилдожение AppWizard, как SDI с именем TestmessageTrans. Теперь идем в меню и делаем пункт меню.

К этому пункту меню прицепляем обработку сообщения в классе вида c выводом информации в окно отладки и вызов данной функции.
void CTestmessageTransView::OnTestTestmessage()
{
TRACE("CTestmessageTransView::OnTestTestmessage()\n");
}
Данная функция вызовется обязательно. Как же вызвать функцию класса
документа. Ну давайте её в классе документа создадим. class CTestmessageTransDoc : public CDocument
{
.......
// Implementation
public:
void TestMessage();
......
};
И реализацию. void CTestmessageTransDoc::TestMessage()
{
TRACE("CTestmessageTransDoc::TestMessage()\n");
}
Как её вызвать в ответ на сообщение поступившее в класс вида ??? Вот так
просто. void CTestmessageTransView::OnTestTestmessage()
{
TRACE("CTestmessageTransView::OnTestTestmessage()\n");
CTestmessageTransDoc* pDoc = GetDocument();
pDoc->TestMessage();
}
Давайте создадим функцию в классе рамки окна. class CMainFrame : public CFrameWnd
{
.........
public:
void TestMessage();
.......
};
И реализацию void CMainFrame::TestMessage()
{
TRACE("CMainFrame::TestMessage()\n");
}
Тоже самое в классе приложения class CTestmessageTransApp : public CWinApp
{
public:
void TestMessage();
CTestmessageTransApp();
.......
};
И реализацию void CTestmessageTransApp::TestMessage()
{
TRACE("CTestmessageTransApp::TestMessage()\n");
}
Осталось получить указатели на эти классы в классе вида. void CTestmessageTransView::OnTestTestmessage()
{
TRACE("CTestmessageTransView::OnTestTestmessage()\n");
CTestmessageTransDoc* pDoc = GetDocument();
pDoc->TestMessage();
CTestmessageTransApp* cw;
cw=(CTestmessageTransApp*)AfxGetApp( );
cw->TestMessage();
CMainFrame* mf;
mf=(CMainFrame*)cw->m_pMainWnd;
mf->TestMessage();
}
Запустите приложение в режиме отладки F5 и выберите пункт меню. Вы
увидите в конце отладки (Debug) текст подтверждающий, что вызовы функций
прошли. Warning: no message line prompt for ID 0x8003. CTestmessageTransView::OnTestTestmessage() CTestmessageTransDoc::TestMessage() CTestmessageTransApp::TestMessage() CMainFrame::TestMessage() The thread 0xFFF813D3 has exited with code 0 (0x0).